public  class Bridge {
    /**
     * @Description 桥接模式
     *  将抽象与实现分离，使它们可以独立变化，让抽象部分和实现部分间的耦合度降低
     *  ------------------------实际问题--------------------------
     *  品牌:     小米、华为
     *  产品:     手机、平板
     *  具体产品:
     *      小米手机:   MiPhone  继承 Phone ， Phone继承 小米品牌
     *      华为手机:   HuaPhone 继承 Phone ， Phone继承 华为品牌
     *      小米平板:   MiPad    继承 Pad ，   Pad继承 小米品牌
     *      小米平板:   HuaPad  继承 Pad ，    Pad继承 华为品牌
     *  此时具体产品类的实际数量为品牌类数✖产品类数  2*2=4
     *  假设一共有n个品牌  m个产品，那么具体产品类的数量为n*m，这可能是一个很庞大的数字，或许是一场灾难
     *  ------------------------解决方案--------------------------
     *  品牌:     小米、华为
     *  产品:     手机、平板
     *  具体产品:
     *      小米手机:   MiPhone  继承 Phone ， MiProduct继承Product          MiPhone组合MiProduct为小米手机
     *      华为手机:   HuaPhone 继承 Phone ， HuaProduct继承Product         HuaPhone组合HuaProduct为华为手机
     *      小米平板:   MiPad    继承 Pad ，   重复利用HuaProduct继承Product   MiPad组合MiProduct为小米平板
     *      小米平板:   HuaPad  继承 Pad ，    MiProduct继承Product          HuaPad组合HuaProduct为华为平板
     *  -------------------------人话---------------------------
     *  通过组合代替继承关系
     *  优点：提高系统可扩展性。符合开放封闭原则。提高了类的复用。降低类间的耦合程度。
     *  缺点：正确识别出两个维度，实际中这可能比较难
     *
     * @Date 16:49 2022/8/10
     * @Author sunye
     **/
    public static void main(String[] args) {
        HuaProduct huaProduct = new HuaProduct(new HuaPhone(), new HuaPad());
        huaProduct.getPhone();
        huaProduct.getPad();

        MiProduct miProduct = new MiProduct(new MiPhone(), new MiPad());
        miProduct.getPhone();
        miProduct.getPad();
        /**
         华为品牌组合手机
         华为手机启动
         华为品牌组合平板
         华为平板启动
         小米品牌组合手机
         小米手机启动
         小米品牌组合平板
         小米平板启动
         **/
    }
}

/**
 * 获得某个产品的抽象类
 */
abstract class Product extends Bridge implements Phone, Pad {
    protected  Phone phone;
    protected  Pad pad;

    public Product(Phone phone, Pad pad) {
        this.phone = phone;
        this.pad = pad;
    }

    public abstract void getPhone();
    public abstract void getPad();


    @Override
    public void startPhone() {
        phone.startPhone();
    }

    @Override
    public void startPad() {
        pad.startPad();
    }
}

//手机接口
interface Phone {
    void startPhone();
}

//小米手机实现类
 class MiPhone  implements Phone {
    @Override
    public void startPhone() {
        System.out.println("小米手机启动");
    }
}

//华为手机实现类
class HuaPhone implements Phone {
    @Override
    public void startPhone() {
        System.out.println("华为手机启动");
    }
}

//pad接口
interface Pad {
    void startPad();
}

//小米平板具体实现类
class MiPad implements Pad {
    @Override
    public void startPad() {
        System.out.println("小米平板启动");
    }
}

//华为平板具体实现类
class HuaPad implements Pad {
    @Override
    public void startPad() {
        System.out.println("华为平板启动");
    }
}

class MiProduct extends Product {
    public MiProduct(Phone phone, Pad pad) {
        super(phone, pad);
    }

    @Override
    public void getPhone() {
        System.out.println("小米品牌组合手机");
        phone.startPhone();
    }
    @Override
    public void getPad() {
        System.out.println("小米品牌组合平板");
        pad.startPad();
    }


}

class HuaProduct extends Product {
    public HuaProduct(Phone phone, Pad pad) {
        super(phone, pad);
    }

    @Override
    public void getPhone() {
        System.out.println("华为品牌组合手机");
        phone.startPhone();
    }
    @Override
    public void getPad() {
        System.out.println("华为品牌组合平板");
        pad.startPad();
    }
}